# 导入模板模块
from flask import render_template, jsonify, session
# 导入current_app,用来调用底层模块
from flask import current_app
# 导入蓝图对象
from . import news_blue
from info.models import User, News, Category
from info.utils.response_code import RET


# 显示项目首页
@news_blue.route("/")
def news():

    # 保存用户数据
    data, user = None, None
    # 获取redis中存储的用户id
    user_id = session.get("user_id")
    print(user_id)
    if user_id:
        # 根据user_id获取用户所有的基础信息，以便于在首页右上角展示个人信息（如头像，昵称等）
        try:
            user = User.query.get(user_id)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="数据库查询错误")
        
    # 获取首页新闻点击排行的数据
    try:
        # 这里获取的是通过新闻的点击量倒序排列的新闻信息的列表
        news_list = News.query.filter().order_by(News.clicks.desc()).limit(6)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询失败")
    
    # 判断获取到的数据是否存在
    if not news_list:
        return jsonify(errno=RET.NODATA, errmsg="没有新闻排行数据")
    # 定义列表，存储每一个子新闻，这里的每一个子新闻身上还有很多的属性
    news_dict_list = []
    # 循环便利得到的news_list对象，获取到每一个子新闻以及子新闻的属性，这个属性是字典
    for new in news_list:
        # 每一个子新闻使用to_dict()方法，获取属性
        news_dict_list.append(new.to_dict())
        
    # 新闻分类数据展示
    try:
        category_list = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询失败")
    
    # 判断是否获取到数据
    if not category_list:
        return jsonify(errno=RET.NODATA, errmsg="没有新闻分类数据")
    # 定义列表，存储分类数据
    category_dict_list = []
    # 循环遍历，取出每一个新闻分类数据
    for category in category_list:
        category_dict_list.append(category.to_dict())

    # 如果用户存在，就把数据存放在字典中，准备返回给前端
    data = {
        # 这里构造了一个字典，给前端使用，to_dict()方法获取了user的一些基本属性，
        # 如果没有获取到这些属性，就把其置为空
        "user_info": user.to_dict() if user else None,
        # 将存储了每一条新闻以及新闻属性的列表传递给前端进行展示
        "user_dict_list": news_dict_list,
        # 将存储了每一条新闻分类以及新闻分类属性的列表传递给前端进行展示
        "category_dict_list": category_dict_list
    }
    print(data)
    print(type(data))
    return render_template("news/index.html", data=data)


# 显示项目图标(自动发送)
@news_blue.route("/favicon.ico")
def favicon():
    # 使用 current_app 函数调用底层的send_static_file向浏览器发送静态文件
    return current_app.send_static_file("news/favicon.ico")